package top.kiterunner.learning.concurrency_test;

//程序在执行过程中，如果出现异常，默认情况锁会被释放。
//所以，在并发处理中，有异常更加需要小心，不然可能会发生不一致的问题。
//比如，在一个WebApp处理过程中，多个servlet线程共同访问同一个资源，
//在第一个线程中抛出异常，其他线程就会进入同步代码区，又能会访问到异常产生的数据。
//因此，要非常小心地处理同步业务逻辑中的异常。
//线程抛出异常时，就会释放相应的锁！！！

import java.util.concurrent.TimeUnit;

/**
 * AdorynZhao in Tencent-UESTC.
 * Source Code Created on 2017/7/3.
 */
public class ThreadDemo6 {

    private int count = 0;

    public synchronized void method() {
        System.out.println(Thread.currentThread().getName() + " Start...");
        while (true) {
            count++;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (count == 5) {
                int i = 1/0;
            }
        }
    }

    public static void main(String[] args) {

        ThreadDemo6 t6 = new ThreadDemo6();

        new Thread(new Runnable() {
            @Override
            public void run() {
                t6.method();
            }
        }, "Thread_1").start();


        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                t6.method();
            }
        }, "Thread_2").start();
    }
}
